/*
 * motor.c
 *
 *  Created on: May 15, 2021
 *      Author: soliber
 *      说明：	电机控制API
 *      		以俯视、顺时针方向为角度的正方向
 */

#include "motor.h"


/*----------------------私有宏定义---------------------*/
//电机参数
#define		STEP_ANGLE_ORIGIN	1.8								//电机原始步距角（°/step）
#define		SUBDIVIDED			51200							//电机驱动器细分,分频系数
#define		STEP_ANGLE			(STEP_ANGLE_ORIGIN/SUBDIVIDED)	//细分后的步距角（°/step）
#define		PPR					(360/STEP_ANGLE)				//单圈脉冲数（step）


/*----------------------私有变量-----------------------*/
static uint32_t step[2];		//记录相对零点的步进计数，范围应限定在0~(PPR-1)
static enum{CW=0,CCW=1} dir	;	//记录方向，CW表示顺时针，CCW表示逆时针

/*----------------------私有函数声明-------------------*/





/*----------------------API实现------------------------*/

/*
 * 函数名：	HAL_Motor_Init
 *
 * 说明：	初始化电机
 * 			所有电机顺时针旋转，检测到零点后停下，并设置当前位置为零点
 *
 * 参数：	timeout，超时时间，单位ms
 *
 * 返回值：	HAL_OK：初始化成功
 * 			HAL_TIMEOUT：初始化超时
 * 			其他：初始化失败
 */
HAL_StatusTypeDef HAL_Motor_Init(uint32_t timeout)
{

	/*
	 * 伪代码
	 *
	 * if(至少有一个电机不在零点)
	 * {
	 * 		在零点的电机step[n] = 0;
	 * 		不在零点的电机开始顺时针旋转
	 * 		time = 当前时间
	 * 		while(当前时间<time+timeout)
	 * 		{
	 * 			if(某个电机i到达了零点)
	 * 			{
	 * 				停止该电机
	 * 				step[i] = 0;
	 * 				if(2个电机全部停止)
	 * 				{
	 * 					return HAL_OK;
	 * 				}
	 * 			}
	 * 		}
	 * 		运行到这里说明规定的时间内未能到达零点，超时
	 * 		return HAL_TIMEOUT;
	 * }
	 *
	 * 否则说明都已经到零点，直接设置零点即可
	 * step[0] = 0;
	 * step[1] = 0;
	 * return HAL_OK;
	 *
	 */
}

/*
 * 函数名：	HAL_Motor_GetPos
 * 说明：	查询电机当前位置
 *
 * 参数：	mot，本次要查询的电机
 * 			取值可以为MOT1、MOT2
 *
 *
 * 返回值：	该电机的当前位置，单位°
 */
float HAL_Motor_GetPos(uint8_t mot)
{
	/*
	 * 伪代码
	 *
	 * 将mot转换为序号i
	 *
	 * return step[i]*STEP_ANGLE;	//step换算成°
	 */
}

/*
 * 函数名：	HAL_Motor_SetPos_Sync
 * 说明：	控制电机1运动到指定的角度，电机2同步运动
 *
 * 参数：	pos，希望移动到的角度（相对零点，向下移动为正），单位°
 * 			取值范围为-180.0~180.0
 *
 * 返回值：	实际移动到的角度，单位°
 */
float HAL_Motor_SetPos_Sync(float pos)
{
	/*
	 * 伪代码
	 *
	 * 计算电机1需要到达的目标位置(step)
	 *
	 * 两个电机同步开始移动
	 *
	 * while(电机没有移动到位);
	 *
	 * 两个电机停止移动
	 *
	 * return 电机1当前的位置（角度）
	 */
}

/*
 * 函数名：	HAL_Motor_GetDelta
 * 说明：	查询电机2相对于电机1的角度差
 *
 * 参数：	无
 *
 * 返回值：	电机2的角度-电机1的角度，单位°
 * 			注：以俯视、顺时针方向为角度的正方向
 */
float HAL_Motor_GetDelta(void)
{
	/*
	 * 伪代码
	 *
	 * return (step[1]-step[0])*STEP_ANGLE;	//step换算成°
	 */
}

/*
 * 函数名：	HAL_Motor_SetDelta
 * 说明：	设置电机2相对于电机1的角度差
 * 			设置完成后电机1不动，电机2移动到对应位置
 *
 * 参数：	delta，电机2相对于电机1的角度差，单位°
 * 			取值范围为-180.0~180.0
 *
 * 返回值：	电机2的角度-电机1的角度，单位°
 * 			注：以俯视、顺时针方向为角度的正方向
 */
float HAL_Motor_SetDelta(float delta)
{
	/*
	 * 伪代码
	 *
	 * 计算电机2需要到达的目标位置(step)
	 *
	 * 电机2开始移动
	 *
	 * while(电机2没有移动到位);
	 *
	 * 电机2停止移动
	 *
	 * return 电机2实际的位置-电机1实际的位置（角度）
	 *
	 */
}



/*----------------------私有函数实现-------------------*/



